﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpDwgDxfInterface.h"
#include "Color.h"
#include "DwgExportData.h"

namespace gcmp
{
    /// \brief 箭头标记
    enum class ArrowMark : int32_t
    {
        Solid = 0,      ///< 实心箭头
        Dot = 3,        ///< 点
        ArchTick = 4,   ///< 建筑标记
    };

    /// \brief 主单位-单位格式。目前仅支持 "小数"，其他为后期扩展能力
    enum class MainUnitFormat : int32_t
    {
        //Scientific      = 1, ///< 科学
        Decimal         = 2, ///< 小数
        //Project         = 3, ///< 工程
        //Architecture    = 4, ///< 建筑
        //Fraction        = 5, ///< 分数
        //WindowsDesk     = 6, ///< windows 桌面
    };

    /// \brief 主单位-精度
    enum class MainUnitAccuracy : int32_t
    {
        DimDec_0 = 0,   ///< 0
        DimDec_1 = 1,   ///< 0.0
        DimDec_2 = 2,   ///< 0.00
        DimDec_3 = 3,   ///< 0.000
        DimDec_4 = 4,   ///< 0.0000
        DimDec_5 = 5,   ///< 0.00000
        DimDec_6 = 6,   ///< 0.000000
        DimDec_7 = 7,   ///< 0.0000000
        DimDec_8 = 8,   ///< 0.00000000
    };

    /// \brief 主单位-消零，目前仅支持 "消除十进制标注中的后续零"，其他为后期扩展能力
    enum class MainUnitZeroSuppression : int32_t
    {
        SuppressFeetAndInches           = 0,    ///<消除零英尺和零英寸
        //IncludeFeetAndInches            = 1,    ///<包含零英尺和零英寸
        //IncludeFeetAndSuppressInches    = 2,    ///<包含零英尺，消除零英寸
        //SuppressFeetAndIncludeInches    = 3,    ///<包含零英寸，消除零英尺
        //SuppressLeadingDecimalZeros     = 4,    ///<消除十进制标注中的前导零（例如，0.5000 变为 .5000）
        SuppressTrailingDecimalZeros    = 8,    ///<消除十进制标注中的后续零（例如，12.5000 变为 12.5）
        //SuppressLeadingAndTrailingDecimalZeros = 12,///<消除前导零和后续零（例如，0.5000 变为 .5）
    };

    /// \brief 标注尺寸线
    class GCMP_DWG_DXF_INTERFACE_EXPORT IDimensionLine
    {
    public:
        /// \brief 创建标注尺寸线类对象
        /// \return 返回标注尺寸线类对象
        static OwnerPtr<IDimensionLine> Create();

        /// \brief 设置标注尺寸线颜色
        /// \param color 颜色
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetColor(const Color& color) = 0;

        /// \brief 获取标注尺寸线颜色
        /// 
        /// \return 返回标注尺寸线颜色
        virtual Color GetColor() const = 0;

        /// \brief 设置标注尺寸线颜色显示方式
        /// \param colorMethod 颜色显示方式
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetColorMethod(const ColorMethod& colorMethod) = 0;

        /// \brief 获取标注尺寸线颜色显示方式
        /// 
        /// \return 返回标注尺寸线颜色显示方式
        virtual ColorMethod GetColorMethod() const = 0;

        /// \brief 设置标注尺寸线宽度
        /// \param lineWidth 标注尺寸线宽度
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetLineWidth(const int lineWidth) = 0;

        /// \brief 获取标注尺寸线宽度
        /// 
        /// \return 返回标注尺寸线宽度
        virtual int GetLineWidth() const = 0;

        /// \brief 拷贝标注尺寸线
        /// \return 返回拷贝的标注尺寸线
        virtual OwnerPtr<IDimensionLine> Clone() const = 0;

        /// \brief 析构函数
        virtual ~IDimensionLine();
    };

    /// \brief 标注尺寸界线
    class GCMP_DWG_DXF_INTERFACE_EXPORT IDimensionBoundaryLine
    {
    public:
        /// \brief 创建标注尺寸界线类对象
        ///
        /// \return 返回标注尺寸界线类对象
        static OwnerPtr<IDimensionBoundaryLine> Create();

        /// \brief 设置标注尺寸界线颜色
        /// \param color 颜色
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetColor(const Color& color) = 0;

        /// \brief 获取标注尺寸界线颜色
        /// 
        /// \return 返回标注尺寸界线颜色
        virtual Color GetColor() const = 0;

        /// \brief 设置标注尺寸界线颜色显示方式
        /// \param colorMethod 颜色显示方式
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetColorMethod(const ColorMethod& colorMethod) = 0;

        /// \brief 获取标注尺寸界线颜色显示方式
        /// 
        /// \return 返回标注尺寸线颜色显示方式
        virtual ColorMethod GetColorMethod() const = 0;

        /// \brief 设置标注尺寸界线宽度
        /// \param lineWidth 线宽
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetLineWidth(const int lineWidth) = 0;

        /// \brief 获取标注尺寸界线宽度
        /// 
        /// \return 返回标注尺寸界线宽度
        virtual int GetLineWidth() const = 0;

        /// \brief 设置标注尺寸界线的超出尺寸线
        /// \param extendLine 超出尺寸线大小
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetExtendLine(const double extendLine) = 0;

        /// \brief 获取标注尺寸界线的超出尺寸线
        /// 
        /// \return 返回标注尺寸界线的超出尺寸线
        virtual double GetExtendLine() const = 0;

        /// \brief 设置标注尺寸界线的起点偏移量
        /// \param originOffset 标注尺寸界线的起点偏移量
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetOriginOffset(const double originOffset) = 0;

        /// \brief 获取标注尺寸界线的起点偏移量
        /// 
        /// \return 返回标注尺寸界线的起点偏移量
        virtual double GetOriginOffset() const = 0;

        /// \brief 拷贝标注尺寸界线
        /// \return 返回拷贝的标注尺寸界线
        virtual OwnerPtr<IDimensionBoundaryLine> Clone() const = 0;

        /// \brief 析构函数
        virtual ~IDimensionBoundaryLine();
    };

    /// \brief 标注文字
    class GCMP_DWG_DXF_INTERFACE_EXPORT IDimensionText
    {
    public:
        /// \brief 创建标注文字类对象
        ///
        /// \return 返回标注文字类对象
        static OwnerPtr<IDimensionText> Create();

        /// \brief 设置标注文字颜色
        /// \param color 颜色
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetColor(const Color& color) = 0;

        /// \brief 获取标注文字颜色
        /// 
        /// \return 返回标注文字颜色
        virtual Color GetColor() const = 0;

        /// \brief 设置标注文字颜色显示方式
        /// \param colorMethod 颜色显示方式
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetColorMethod(const ColorMethod& colorMethod) = 0;

        /// \brief 获取标注文字颜色显示方式
        /// 
        /// \return 返回标注文字颜色显示方式
        virtual ColorMethod GetColorMethod() const = 0;

        /// \brief 设置标注文字的尺寸线偏移
        /// \param offsetDimLine 尺寸线偏移大小
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetOffsetDimensionLine(const double offsetDimLine) = 0;

        /// \brief 获取标注文字的尺寸线偏移
        /// 
        /// \return 返回标注文字的尺寸线偏移
        virtual double GetOffsetDimensionLine() const = 0;

        /// \brief 设置标注文字的文字高度
        /// \param textSize 文字高度
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetTextSize(const double textSize) = 0;

        /// \brief 获取标注文字的文字高度
        /// 
        /// \return 返回标注文字的文字高度
        virtual double GetTextSize() const = 0;

        /// \brief 设置标注文字的文字样式名字
        /// \param styleName 文字样式名字
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetStyleName(const std::wstring& styleName) = 0;

        /// \brief 获取标注文字的文字样式名字
        /// 
        /// \return 返回标注文字的文字样式名字
        virtual std::wstring GetStyleName() const = 0;

        /// \brief 拷贝标注文字
        /// \return 返回拷贝的标注文字
        virtual OwnerPtr<IDimensionText> Clone() const = 0;

        /// \brief 析构函数
        virtual ~IDimensionText();
    };

    /// \brief 标注符号
    class GCMP_DWG_DXF_INTERFACE_EXPORT IDimensionSymbol
    {
    public:
        /// \brief 创建标注符号类对象
        ///
        /// \return 返回标注符号类对象
        static OwnerPtr<IDimensionSymbol> Create();

        /// \brief 设置箭头标记
        /// \param arrowMark 箭头标记
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetArrowMark(const ArrowMark& arrowMark) = 0;

        /// \brief 获取箭头标记
        /// 
        /// \return 返回箭头标记
        virtual ArrowMark getArrowMark() const = 0;

        /// \brief 设置箭头大小
        /// \param arrowSize 箭头大小
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetArrowSize(const double arrowSize) = 0;

        /// \brief 获取箭头大小
        /// 
        /// \return 返回箭头大小
        virtual double GetArrowSize() const = 0;

        /// \brief 拷贝标注符号
        /// \return 返回拷贝的标注符号
        virtual OwnerPtr<IDimensionSymbol> Clone() const = 0;

        /// \brief 析构函数
        ~IDimensionSymbol();
    };

    /// \标注主单位
    class GCMP_DWG_DXF_INTERFACE_EXPORT IDimensionMainUnit
    {
    public:
        /// \brief 创建标注主单位类对象
        ///
        /// \return 返回标注主单位类对象
        static OwnerPtr<IDimensionMainUnit> Create();

        // \bruef 单位格式
        /// \param 
        /// \return 
        virtual void SetUnitFormat(MainUnitFormat value) = 0;

        /// \brief 获取单位格式
        /// \return 返回单位格式
        virtual MainUnitFormat GetUnitFormat() const = 0;
        
        // \bruef 精度
        /// \param 
        /// \return 
        virtual void SetAccuracy(MainUnitAccuracy value) = 0;

        /// \brief 获取精度
        /// \return 返回精度
        virtual MainUnitAccuracy GetAccuracy() const = 0;

        // \bruef 舍入，要求非负数
        /// \param 
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetRoundoff(double dValue) = 0;

        /// \brief 获取舍入值
        /// \return 返回舍入值
        virtual double GetRoundoff() const = 0;

        // \bruef 比例因子，要求正数
        /// \param 
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetScale(double dValue) = 0;

        /// \brief 获取比例因子
        /// \return 返回比例因子
        virtual double GetScale() const = 0;

        // \bruef 消零
        /// \param 
        /// \return 
        virtual void SetZeroSuppression(MainUnitZeroSuppression value) = 0;

        /// \brief 获取消零
        /// \return 返回消零
        virtual MainUnitZeroSuppression GetZeroSuppression() const = 0;

        /// \brief 拷贝样式设置
        /// \return 返回拷贝的样式设置
        virtual OwnerPtr<IDimensionMainUnit> Clone() const = 0;

    public:
        /// \brief 析构函数
        virtual ~IDimensionMainUnit();
    };

    /// \brief GNode节点获取图层信息参数
    class GCMP_DWG_DXF_INTERFACE_EXPORT ICADDimensionStyle
    {
    public:
        /// \brief 创建标注样式类对象
        ///
        /// \return 返回标注样式类对象
        static OwnerPtr<ICADDimensionStyle> Create();

    public:
        /// \brief 设置样式名字
        /// \param styleName 样式名字
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetStyleName(const std::wstring& styleName) = 0;

        /// \brief 获取样式名字
        /// \return 返回样式名字
        virtual std::wstring GetStyleName() const = 0;

        /// \brief 设置标注尺寸线
        /// \param line 尺寸线
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetDimensionLine(OwnerPtr<IDimensionLine> line) = 0;

        /// \brief 获取标注尺寸线
        /// \return 尺寸线
        virtual const IDimensionLine* GetDimensionLine() const = 0;

        /// \brief 设置标注尺寸界线
        /// \param line 尺寸界线
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetDimensionBoundaryLine(OwnerPtr<IDimensionBoundaryLine> opBoundaryLine) = 0;

        /// \brief 获取标注尺寸界线
        /// \return 尺寸界线
        virtual const IDimensionBoundaryLine* GetDimensionBoundaryLine() const = 0;

        /// \brief 设置标注文字
        /// \param text 标注文字
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetDimensionText(OwnerPtr<IDimensionText> opDimensionText) = 0;

        /// \brief 获取标注文字
        /// \return 返回标注文字
        virtual const IDimensionText* GetDimensionText() const = 0;

        /// \brief 设置标注符号
        /// \param symbol 标注符号
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetDimensionSymbol(OwnerPtr<IDimensionSymbol> opDimSymbol) = 0;

        /// \brief 获取标注符号
        /// \return 返回标注符号
        virtual const IDimensionSymbol* GetDimensionSymbol() const = 0;

        /// \brief 设置主单位
        /// \param opMainUnit 主单位
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetDimensionMainUnit(OwnerPtr<IDimensionMainUnit> opMainUnit) = 0;

        /// \brief 获取主单位
        /// \return 返回主单位
        virtual const IDimensionMainUnit* GetDimensionMainUnit() const = 0;
        

        /// \brief 拷贝样式设置
        /// \return 返回拷贝的样式设置
        virtual OwnerPtr<ICADDimensionStyle> Clone() const = 0;

    public:
        /// \brief 析构函数
        virtual ~ICADDimensionStyle();
    };


}


